package com.mayfool.gitmanager.ui;

import com.mayfool.gitmanager.core.entity.CredentialsInfo;
import com.mayfool.gitmanager.core.manager.CredentialsManager;

import javax.swing.*;
import java.awt.*;

/**
 * @author zhou.xu
 * @description: Git仓库凭证配置面板
 * 用于配置Git仓库的访问凭证，包括URL、用户名和密码
 * 采用网格布局排列输入组件，确保安全的密码输入
 * @date 2025/3/12 13:24
 * @since JDK 1.8
 */
public class CredentialsConfigPanel extends JPanel {

    /**
     * Git仓库URL输入框
     */
    private JTextField urlField;

    /**
     * 用户名输入框
     */
    private JTextField usernameField;

    /**
     * 密码输入框
     * 使用JPasswordField确保密码不会明文显示
     */
    private JPasswordField passwordField;

    /**
     * 构造函数
     * @param url Git仓库URL
     */
    public CredentialsConfigPanel(String url) {
        // 使用4行2列的网格布局
        setLayout(new GridLayout(4, 2));

        // 添加URL输入组件
        add(new JLabel("url:"));
        urlField = new JTextField(url);
        add(urlField);

        // 添加用户名输入组件
        add(new JLabel("用户名:"));
        usernameField = new JTextField();
        add(usernameField);

        // 添加密码输入组件
        add(new JLabel("密码:"));
        passwordField = new JPasswordField();
        add(passwordField);
    }

    /**
     * 保存凭证信息
     * 将用户输入的凭证信息保存到凭证管理器中
     */
    private void saveCredentials() {
        String url = urlField.getText();
        String username = usernameField.getText();
        // 安全地获取密码字符数组并转换为字符串
        String password = new String(passwordField.getPassword());

        // 创建凭证信息对象
        CredentialsInfo credentialsInfo = new CredentialsInfo();
        credentialsInfo.setUsername(username);
        credentialsInfo.setPassword(password);

        // 保存到凭证管理器
        CredentialsManager.setCredentialsInfo(url, credentialsInfo);
    }

    /**
     * 显示凭证配置对话框
     * @param parent 父组件
     */
    public void showDialog(Component parent) {
        int result = JOptionPane.showConfirmDialog(parent, this, "设置Git仓库凭证",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

        if (result == JOptionPane.OK_OPTION) {
            saveCredentials();
        }
    }
}
